import os # импортируем модуль os, который позволяет выполнять команды операционной системы.
import platform # импортируем модуль platform, который предоставляет информацию об операционной системе.
import ntplib # импортируем модуль ntplib, который позволяет подключаться к серверам NTP и получать текущее время.
from time import ctime # импортируем функцию ctime из модуля time, чтобы преобразовывать время в удобочитаемый формат.
import datetime # импортируем модуль datetime, который предоставляет функции для работы с датами и временем.
from tzlocal import get_localzone # импортируем функцию get_localzone из модуля tzlocal, чтобы получить часовой пояс операционной системы.
import pytz # импортируем модуль pytz, который предоставляет базу данных часовых поясов.

def set_system_time():
    # Определение операционной системы
    system = platform.system()

    while True:
        server_address = input("Введите адрес сервера NTP (нажмите Enter для использования pool.ntp.org): ")

        if not server_address:
            server_address = 'pool.ntp.org'

        print("Адрес сервера: {}".format(server_address))

        try:
            print("Подключение к серверу NTP...")
            client = ntplib.NTPClient()
            response = client.request(server_address)
            current_time = ctime(response.tx_time)

            print("Текущее время: {}".format(current_time))
            print("Статус синхронизации: {}".format(response.leap))
            print("Время запроса: {}".format(ctime(response.orig_time)))
            print("Время ответа: {}".format(ctime(response.recv_time)))

            new_time_utc = datetime.datetime.utcfromtimestamp(response.tx_time)  # Преобразуем в объект типа datetime.datetime в UTC

            local_timezone = get_localzone()  # Получаем часовой пояс операционной системы
            new_time_local = new_time_utc.replace(tzinfo=pytz.utc).astimezone(local_timezone)  # Преобразуем в локальный часовой пояс

            if system == 'Linux':
                os.system("date -s '{}'".format(new_time_local.strftime('%Y-%m-%d %H:%M:%S')))
                print("Время успешно установлено на Linux.")
            elif system == 'Windows':
                os.system('cmd /c "time {}:{}:{}"'.format(new_time_local.hour, new_time_local.minute, new_time_local.second))
                print("Время успешно установлено на Windows.")
            elif system == 'Darwin':  # Для macOS
                os.system("date -u '{}'".format(new_time_local.strftime('%Y-%m-%d %H:%M:%S')))  # Используйте флаг -u для установки UTC времени
                print("Время успешно установлено на macOS.")
            else:
                print("Не удалось определить операционную систему")

            print("Новое время: {} ({})".format(new_time_local.strftime('%Y-%m-%d %H:%M:%S'), local_timezone))

            # Вычисляем разницу между старым и новым временем
            time_difference = response.tx_time - response.orig_time
            print("Разница во времени: {} секунд".format(time_difference))

            break

        except ntplib.NTPException as e:
            print("Ошибка при подключении к серверу NTP: {}".format(str(e)))
            print("Попробуйте ввести другой адрес сервера.")

set_system_time()